/*
 * Board.java
 *
 * Created on 2005/01/21 +0900
 *
 * $Revision: 99 $
 * $Date: 2010-02-15 08:58:19 +0000 (Mon, 15 Feb 2010) $
 */

package org.gikolet.ch2.data;

import java.io.Serializable;

import org.gikolet.util.ArgumentChecker;

/**
 * BBSにおいて板を表すクラス。
 * 
 * @author Tetsutaro (latest modification by $Author: zh1bvtan1 $)
 * @version $Revision: 99 $ $Date: 2010-02-15 08:58:19 +0000 (Mon, 15 Feb 2010) $
 */
public class Board implements Serializable {

	/**
	 * シリアルバージョンID。
	 */
	private static final long serialVersionUID = 6651074010376036351L;

	/**
	 * 板のID
	 */
	private Long id;

	private String hostName;

	/**
	 * 板を示すBBS内で一意なキー。
	 */
	private String path;

	/**
	 * 板の一意な名前。
	 */
	private String name;

	/**
	 * ハッシュコードのキャッシュ。
	 */
	private transient int hashCodeCache = 0;

	/**
	 * Boardを作成する。
	 * 
	 * @param board
	 *            板
	 */
	public Board(Board board) {

		this(board.id, board.hostName, board.path, board.name);
	}

	/**
	 * Boardを作成する。
	 * 
	 * @param path
	 *            板を示すBBS内で一意なキー
	 * @param name
	 *            板名
	 */
	public Board(String hostName, String path, String name) {
		this(null, hostName, path, name);
	}

	/**
	 * Boardを作成する。
	 * 
	 * @param id
	 *            板のID
	 * @param path
	 *            板を示すBBS内で一意なキー
	 * @param name
	 *            板名
	 */
	public Board(Long id, String hostName, String path, String name) {
		ArgumentChecker.checkNullAndEmpty(hostName);
		ArgumentChecker.checkNullAndEmpty(path);
		ArgumentChecker.checkNullAndEmpty(name);

		this.id = id;
		this.hostName = hostName;
		this.path = path;
		this.name = name;
	}

	/**
	 * IDを返す。
	 * 
	 * @return ID
	 */
	public Long getId() {
		return this.id;
	}

	/**
	 * IDを設定する。
	 * 
	 * @param id
	 *            ID
	 */
	public void setId(Long id) {
		this.id = id;
	}

	public String getHostName() {
		return hostName;
	}

	public void setHostName(String hostName) {
		this.hostName = hostName;
	}

	/**
	 * キーを返す。
	 * 
	 * @return 板名
	 */
	public String getPath() {
		return this.path;
	}

	/**
	 * キーを設定する。
	 * 
	 * @param path
	 *            キー
	 */
	public void setPath(String path) {
		ArgumentChecker.checkNullAndEmpty(path);

		this.hashCodeCache = 0;
		this.path = path;
	}

	/**
	 * 板名を返す。
	 * 
	 * @return 板名
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * 板名を設定する。
	 * 
	 * @param name
	 *            板名
	 */
	public void setName(String name) {
		ArgumentChecker.checkNullAndEmpty(name);

		this.name = name;
	}

	/**
	 * オブジェクトのハッシュコード値を返します。これはキーの{@link String#hashCode()}と同じ値となる。
	 * 
	 * @return このオブジェクトのハッシュコード値
	 */
	public int hashCode() {

		if (this.hashCodeCache == 0) {
			this.hashCodeCache = this.path.hashCode();
		}

		return this.hashCodeCache;
	}

	/**
	 * この板と指定されたオブジェクトを比較する
	 * 
	 * @param obj
	 *            比較するオブジェクト
	 */
	public boolean equals(Object obj) {
		if (obj instanceof Board) {
			return equals((Board) obj);
		}
		return false;
	}

	/**
	 * この板と指定された板を比較する
	 * 
	 * @param obj
	 *            比較する板
	 */
	public boolean equals(Board board) {
		if (board == null) {
			return false;
		}
		return this.path.equals(board.path);
	}

	/**
	 * この板の文字列表現を返す
	 * 
	 * @return この板の文字列表現
	 */
	public String toString() {
		return "key=" + this.path + ", name=" + this.name;
	}
}
